#!/bin/bash
source /root/.bashrc

# 1.设置监控对象（根据实际情况进行调整）
disk_drive="vda"
route="/data"


# 2.定义日志文件路径和保留个数（根据实际情况进行调整）
log_dir="/root"
log_file="/root/resource_monitor_$(date +"%Y%m%d").log"
clean_interval=3


# 3.记录监控时间的函数
log_monitor_time() {
  current_time=$(date +"%Y-%m-%d %H:%M:%S")
  echo -e "\E[1;33m[$current_time] - Resource Monitoring\E[0m" >> "$log_file"
}

# 4.检查CPU使用率
check_cpu_usage() {
  cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
  log_monitor_time
  echo "CPU使用率为：$cpu_usage%" >> "$log_file"
}

# 5.检查内存使用率
check_memory_usage() {
  memory_usage=$(free -m | awk 'NR==2{printf "%.2f", $3*100/$2 }')
  log_monitor_time
  echo "内存使用率为：$memory_usage%" >> "$log_file"
}

# 6.检查磁盘I/O使用率
check_io_usage() {
  io_usage=$(iostat -dx 1 1 | grep ${disk_drive} |awk '{print $NF}')
  log_monitor_time
  echo "磁盘I/O使用率为：$io_usage%" >> "$log_file"
}

# 7.检查磁盘空间使用率
check_disk_usage() {
  disk_usage=$(df -h ${route} | grep ${route} | awk '{print $5}' | sed 's/%//g')
  log_monitor_time
  echo "磁盘空间使用率为：$disk_usage%" >> "$log_file"
}

# 8.检查数据库连接数
check_current_connect() {
  current_connect=$(psql -c 'select count(*) from pg_stat_activity;'|sed -n '3p'|awk '{print $1}')
  log_monitor_time
  echo "各数据库连接数：" >> "$log_file"
  psql -c 'select now(),state,count(*),usename,datname from pg_stat_activity group by 1,2,4,5 order by count desc;' >> "$log_file"
}

# 9.结束
check_end() {
  echo -e "\E[1;33m"**************************************************************************************"\E[0m" >> "$log_file"
  echo -e "\E[1;33m"************************************本轮检查完成！************************************"\E[0m" >> "$log_file"
  echo -e "\E[1;33m"**************************************************************************************"\E[0m" >> "$log_file"
}


# 10.执行检查并发送告警邮件
check_cpu_usage
check_memory_usage
check_io_usage
check_disk_usage
check_current_connect
check_end

# 11.定期清理日志文件
FileNum=$(ls -l $log_dir/resource_monitor* |grep ^- |wc -l)

while(( FileNum > clean_interval))
do
    OldFile=$(ls -rt $log_dir/resource_monitor*| head -1)
    echo  "Delete File:" $OldFile
    rm -f $OldFile
    let "FileNum--"
done